## ИТОГОВАЯ РАБОТА 

_критерии оценки_

* `удовл` - реализован алгоритм Луна

* `хорошо` - проект оформлен в ООП стиле. Реализован класс `Card` и CardBank. Описаны методы `CRUD` для класса `Card` 

* `отлично` - создана база данных `CardBank` с двумя соответствующим взаимосвязанными таблицами. К БД реализован механизм `CRUD`

* `отлично+` - к БД реализован асинхронный механизм чтения-записи данных

### База данных банковских карт


### *Техническое задание*


### 1. Пользователь вводит номер банковой карты

Перед созданием объекта класса Card 16-значный вводимый номер проходит валидацию по алгоритму Луна

### *Алгоритм Луна*

Последняя цифра номера банковской карты (и некоторых других номеров карт и счетов) - это всегда контрольная сумма, которая считается по алгоритму `Луна`. 

Таким образом, если пользователь ошибётся в одной цифре или перепутает две цифры местами, то это легко вычислить на стороне терминала, не делая запрос в банк.

Пользователь вводит номер кредитной карты (16-значное целое число), а программа вычисляет и проверяет проверяет контрольную сумму, и говорит, валидный номер или нет. Алгоритм подсчёта суммы:

  1. Цифры проверяемой последовательности нумеруются справа налево (Последняя цифра тоже считается, её номер - единица).

  2. Цифры, оказавшиеся на нечётных местах, остаются без изменений.

  3. Цифры, стоящие на чётных местах, умножаются на 2.

  4. Если в результате такого умножения возникает число больше 9, оно заменяется суммой цифр получившегося произведения — однозначным числом, то есть цифрой.

  5. Все полученные в результате преобразования цифры складываются. Если сумма кратна 10, то исходные данные верны.

*Примечание: Длина номера карты может не равняться 16 (дополнительные карты, экзотические платёжные системы и прочее). Также этот алгоритм часто парименяют, например, к номерам счетов и дисконтных карт. Поэтому лучше обобщить своё решение на произвольную длину номера*

### 2. Далее по первым двум цифрам определяется платежная система 

##  _Проверка платежной системы_

* 2 - Мир
* 3 - American Express, JCB International, Diners Club
  * 30, 36, 38 - Diners Club
  * 31, 35 - JCB International
  * 34, 37 - American Express
* 4 - VISA
* 5 - MasterCard, Maestro
  * 50, 56, 57, 58 - Maestro
  * 51, 52, 53, 54, 55 - MasterCard
* 6 - Maestro, China UnionPay, Discover
  * 60 - Discover
  * 62 - China UnionPay
  * 63, 67 - Maestro
* 7 - УЭК (Универсальная электронная карта)

> American Express, Maestro, JCB, Discover - не работают в РФ


### 3. Если карта валидна, она помещается в список, реализованный классом `CardBank`

### 4. Метод `__str__` выводит данные о банке карт в следующем виде 

## Тестовые данные

Пользователь |  Входные данные  |  Выходные данные | Система | Оплата
------------ |---------|-------|---------|----------
Иван Иванов | 4274 9910 0017 1851 | Да | Visa | Работает
Олег Петров | 2202 2023 9427 7036 | Да | Мир | Работает
Joe Biden  | 5019 5555 4444 5555 | Да | Maestro | Не работает
Егор Саперов | 4034 5323 0294 8848 | Нет | Visa | Работает
Джо Шуа | 6011 5564 4857 8945 8 | Нет | Discover | Не работает
Петр Морозов | 1234 5678 9123 4672 | Нет | Visa | Работает
Владимир Кличко | 5425 2334 3010 9903 | Да | MasterCard | Работает


### 5. Данные о сущностях Card и CardBank пишутся в базу данных


##  Примерная структура проекта

```python
from enum import Enum


class CardBank:
    ...

class PaySystem(Enum):
    ...

class Card:
    ...

class CardBankDataBase:

```